package com.sky.service.impl;

import com.sky.context.BaseContext;
import com.sky.dto.ShoppingCartDTO;
import com.sky.entity.Dish;
import com.sky.entity.Setmeal;
import com.sky.entity.ShoppingCart;
import com.sky.mapper.DishMapper;
import com.sky.mapper.SetmealMapper;
import com.sky.mapper.ShoppingCartMapper;
import com.sky.service.shoppingCartService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;

/**
 * @author 星河一叶Ck
 * @date 2024/10/5
 */

@Service
public class shoppingCartServiceImpl implements shoppingCartService {

    @Autowired
    private ShoppingCartMapper shoppingCartMapper;
    @Autowired
    private DishMapper dishMapper;
    @Autowired
    private SetmealMapper setmealMapper;

    /**
     * 添加购物车
     * @param shoppingCartDTO
     */
    public void add(ShoppingCartDTO shoppingCartDTO) {
        // 判断当前插入到购物车的商品是否已经存在
        ShoppingCart shoppingCart = new ShoppingCart();
        BeanUtils.copyProperties(shoppingCartDTO,shoppingCart);
        // 设置用户id (因为拦截器会捕获 所以可以直接进行设置到)
        shoppingCart.setUserId(BaseContext.getCurrentId());
        System.out.println(shoppingCart);
        // 数据库查询数据
        List<ShoppingCart> list = shoppingCartMapper.list(shoppingCart);
        // 如果不为空
        // 那么查到的数据只会是一条 因为每个人对应一个购物车 然后同样的东西只会放一次
        if(list.size() == 1 && list != null){
            //如果已经存在，就更新数量，数量加1
            shoppingCart = list.get(0);
            shoppingCart.setNumber(shoppingCart.getNumber() + 1);
            shoppingCartMapper.updateNumberById(shoppingCart);
        }else{
            // 如果不存在 那么就为其创建数据并且添加进去
            // 那么判断是属于菜品 还是 套餐
            // 还需要获取到对应的 名字 价格 以及图片
            Long dishId = shoppingCart.getDishId();
            if(dishId != null) {
                // 这里是属于菜品
                Dish dish = dishMapper.getById(dishId);
                shoppingCart.setName(dish.getName());
                shoppingCart.setAmount(dish.getPrice());
                shoppingCart.setImage(dish.getImage());
            }else {
                // 否则就是属于套餐
                Setmeal setmeal = setmealMapper.getById(shoppingCart.getSetmealId());
                shoppingCart.setName(setmeal.getName());
                shoppingCart.setAmount(setmeal.getPrice());
                shoppingCart.setImage(setmeal.getImage());
            }
            // 下面是两个都会进行的操作 所以进行代码整理提取出来
            shoppingCart.setNumber(1);
            shoppingCart.setCreateTime(LocalDateTime.now());
            shoppingCartMapper.insert(shoppingCart);
        }
    }



    /**
     * 查看购物车
     */
    public List<ShoppingCart> showShoppingCart() {
//        ShoppingCart shoppingCart = ShoppingCart.builder()
//                .userId(BaseContext.getCurrentId())
//                .build();
        // 根据id查询
//        return shoppingCartMapper.list(shoppingCart);
        return shoppingCartMapper.list(ShoppingCart.builder()
                .userId(BaseContext.getCurrentId())
                .build());
    }

    /**
     * 清空购物车
     */
    public void cleanShoppingCart() {
        // 获取对应用户id 然后调用mapper 清空的sql语句
        shoppingCartMapper.deleteByUserId(BaseContext.getCurrentId());
    }

    /**
     * 删除购物车中的一个商品
     * @param shoppingCartDTO
     */
    public void subShoppingCart(ShoppingCartDTO shoppingCartDTO) {
        // 进行查询是哪一个种类(菜品或者套餐)
        ShoppingCart shoppingCart = new ShoppingCart();
        BeanUtils.copyProperties(shoppingCartDTO,shoppingCart);
        List<ShoppingCart> list = shoppingCartMapper.list(shoppingCart);
        if(list.size() > 0 && list != null) {
            // 根据shopping里面有哪一个id 查到对应的 然后并且重新给shopping赋值
            shoppingCart = list.get(0);

            // 获取数量
            Integer number = shoppingCart.getNumber();
            if(number == 1) {
                // 如果数量为1个 那么就可以直接清空该条商品
                // 因为shoppingCart 里面封装了一个id 也就是数据库对应每一条数据的主键的id
                shoppingCartMapper.deleteById(shoppingCart);
            }else {
                // 如果不为1 那么就是数量减1 每发一次减少都是减去1
                shoppingCart.setNumber(shoppingCart.getNumber() - 1);
                // 然后调用更新语句进行更新
                shoppingCartMapper.updateNumberById(shoppingCart);
            }
        }
    }
}
